package com.woniuxy.ams.service.impl;

import com.woniuxy.ams.dao.RoleDao;
import com.woniuxy.ams.dao.UserDao;
import com.woniuxy.ams.entity.Role;
import com.woniuxy.ams.entity.User;
import com.woniuxy.ams.service.AuthService;
import com.woniuxy.ams.utils.JwtUtils;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author fyx
 */
@Service
public class AuthServiceImpl implements AuthService {
    @Resource
    private UserDao userDao;
    @Resource
    private RoleDao roleDao;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Override
    public User login(String name, String password) {
        User user = userDao.findOneByName(name);
        SimpleHash hash = new SimpleHash("MD5", password, name + "simpleWoNiu");
        if (user != null && hash.toHex().equals(user.getPassword())) {
            user.setPassword(null);
            // 使用jwtUtils生成token，token中不在包含过期时间，交由redis实现
            // token中默认包含创建时间，不同时间登录会生成不同token
            String token = JwtUtils.sign(name);
            user.setToken(token);
            // 将token放入redis进行管理，(username + token)作为键值，实现多个用户端登录，强制下线其余设备
            // 设置过期时间为120分钟
            redisTemplate.opsForValue().set(name+"::token", user,120, TimeUnit.MINUTES);
            return user;
        }
        return null;
    }

    @Override
    public List<String> getRoles(int id) {
        return roleDao.getRolesName(id);
    }
}
